/*
 * This file is part of Annuaire.
 *
 * Annuaire is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Foobar is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Annuaire.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.miage.annuaire.data;

import java.util.ArrayList;

public class DataAccessMock implements DataAccess {

	/**
	 * Renvoie les clés des structures du premier niveau.
	 */
	@Override
	public ArrayList<String> getStructures() {
		ArrayList<String> structures = new ArrayList<String>();
		structures.add("S1");
		structures.add("S2");
		return structures;
	}

	/**
	 * Renvoie les clés des structures d'un niveau donné.
	 */
	@Override
	public ArrayList<String> getStructures(int level) {
		ArrayList<String> structures = new ArrayList<String>();
		
		switch (level) {
		
			case 1:
				structures.add("S1");
				structures.add("S2");
				break;
		
			case 2:
				structures.add("S1.1");
				structures.add("S1.2");
				structures.add("S2.1");
				structures.add("S2.2");
				break;
		
			case 3:
				structures.add("S1.1.1");
				structures.add("S1.1.2");
				break;
		}
		
		return structures;
	}

	/**
	 * Renvoie la clef père d'une structure, ou "struct" si la structure est
	 * racine. Renvoie "" si la structure n'existe pas.
	 */
	@Override
	public String getStructureFather(String struct) {
		
		if ("S1".equals(struct) || "S2".equals(struct)) {
			return "struct";
		} else if ("S1.1".equals(struct) || "S1.2".equals(struct)) {
			return "S1";
		} else if ("S2.1".equals(struct) || "S2.2".equals(struct)) {
			return "S2";
		} else if ("S1.1.1".equals(struct) || "S1.1.2".equals(struct)) {
			return "S1.1";
		}
		
		return "";
	}

	/**
	 * Renvoie la liste des clés des structures filles d'une structure donnée.
	 */
	@Override
	public ArrayList<String> getStructureChilds(String struct) {
		
		ArrayList<String> structures = new ArrayList<String>();
		
		if ("S1".equals(struct)) {
			structures.add("S1.1");
			structures.add("S1.2");
		} else if ("S2".equals(struct)) {
			structures.add("S2.1");
			structures.add("S2.2");
		} else if ("S1.1".equals(struct)) {
			structures.add("S1.1.1");
			structures.add("S1.1.2");
		}
		
		return structures;
	}

	/**
	 * Renvoie le nom court d'une structure, ou "" si la structure n'existe pas.
	 */
	@Override
	public String getShortName(String struct) {
		return this.getInfo("struct", struct);
	}

	/**
	 * Renvoie le nom complet d'une structure, ou "" si la structure n'existe
	 * pas.
	 */
	@Override
	public String getCompleteName(String struct) {
		return this.getInfo("structure", struct);
	}

	/**
	 * Renvoie le code du leader d'une structure, ou "" s'il n'y a pas de leader
	 * ou si la structure n'existe pas.
	 */
	@Override
	public String getLeader(String struct) {		
		return this.getInfo("leader", struct);
	}

	/**
	 * Renvoie le titre du leader d'une structure, ou "" s'il n'y a pas de
	 * leader ou si la structure n'existe pas.
	 */
	@Override
	public String getLeaderTitle(String struct) {
		return this.getInfo("leaderTitle", struct);
	}

	/**
	 * Renvoie le code du contact d'une structure, ou "" s'il n'y a pas de
	 * leader ou si la structure n'existe pas.
	 */
	@Override
	public String getContact(String struct) {
		return this.getInfo("contact", struct);
	}

	/**
	 * Renvoie la liste des codes des assistants leader d'une structure.
	 */
	@Override
	public ArrayList<String> getAsistantLeaders(String struct) {
		ArrayList<String> assistants = new ArrayList<String>();
		
		if("S1".equals(struct)) {
			assistants.add("assistant1-S1");
			assistants.add("assistant2-S1");
		}
		
		return assistants;
	}

	/**
	 * Renvoie la liste des titres des assistants leader d'une structure.
	 */
	@Override
	public ArrayList<String> getAsistantLeadersTitle(String struct) {
		ArrayList<String> assistants = new ArrayList<String>();
		
		if("S1".equals(struct)) {
			assistants.add("assistantTitle1-S1");
			assistants.add("assistantTitle2-S1");
		}
		
		return assistants;
	}

	/**
	 * Renvoie la liste des codes des membres d'une structure.
	 */
	@Override
	public ArrayList<String> getMembers(String struct) {
		
		ArrayList<String> membres = new ArrayList<String>();
		String prefix = "membre";
		
		if ("S1".equals(struct)) {
			membres.add(prefix + "1-S1");
			membres.add(prefix + "2-S1");
		} else if ("S2".equals(struct)) {
			membres.add(prefix + "1-S2");
			membres.add(prefix + "2-S2");
		} else if ("S1.1".equals(struct)) {
			membres.add(prefix + "1-S1.1");
			membres.add(prefix + "2-S1.1");
		} else if ("S1.2".equals(struct)) {
			membres.add(prefix + "1-S1.2");
			membres.add(prefix + "2-S1.2");
		} else if ("S2.1".equals(struct)) {
			membres.add(prefix + "1-S2.1");
			membres.add(prefix + "2-S2.1");
		} else if ("S2.2".equals(struct)) {
			membres.add(prefix + "1-S2.2");
			membres.add(prefix + "2-S2.2");
		} else if ("S1.1.1".equals(struct)) {
			membres.add(prefix + "1-S1.1.1");
			membres.add(prefix + "2-S1.1.1");
		} else if ("S1.1.2".equals(struct)) {
			membres.add(prefix + "1-S1.1.2");
			membres.add(prefix + "2-S1.1.2");
		}
		
		return membres;
	}

	/**
	 * Renvoie le nom d'une personne.
	 */
	@Override
	public String getName(String person) {
		return this.getInfoMembre("name", person);
	}

	/**
	 * Renvoie le téléphone d'une personne.
	 */
	@Override
	public String getPhone(String person) {
		return this.getInfoMembre("phone", person);
	}

	/**
	 * Renvoie le bureau d'une personne.
	 */
	@Override
	public String getOffice(String person) {
		return this.getInfoMembre("office", person);
	}

	/**
	 * Renvoie la fonction d'une personne.
	 */
	@Override
	public String getFunction(String person) {
		return this.getInfoMembre("function", person);
	}

	protected String getInfo(String prefix, String struct) {
		
		if ("S1".equals(struct)) {
			return  prefix + "S1";
		} else if ("S2".equals(struct)) {
			return  prefix + "S2";
		} else if ("S1.1".equals(struct)) {
			return prefix + "S1.1";
		} else if ("S1.2".equals(struct)) {
			return prefix + "S1.2";
		} else if ("S2.1".equals(struct)) {
			return prefix + "S2.1";
		} else if ("S2.2".equals(struct)) {
			return prefix + "S2.2";
		} else if ("S1.1.1".equals(struct)) {
			return prefix + "S1.1.1";
		} else if ("S1.1.2".equals(struct)) {
			return prefix + "S1.1.2";
		}
		
		return "";
		
	}
	
	protected String getInfoMembre(String suffix, String membre) {
		return membre + "-" + suffix;
	}
}
